def log(*args):
    print(*args)


def is_punctuation(char):
    """
    检查给定的字符是否为 JSON 中的标点符号
    参数：
        char: str - 要检查的字符
    返回：
        bool - 如果字符是标点符号返回 True，否则返回 False
    """
    return char in '{}:,[],'


def extract_string(json_string, start_index):
    """
    从给定的索引开始提取 JSON 字符串，并返回提取的字符串及结束索引
    参数：
        json_string: str - 要从中提取字符串的 JSON 格式字符串
        start_index: int - 开始提取的索引
    返回：
        tuple - 包含提取的字符串及结束索引的元组
    """
    end_index = start_index + 1
    while end_index < len(json_string):
        if json_string[end_index] == '\\':
            end_index += 2  # 跳过转义字符及其后面的字符
        elif json_string[end_index] == '"':
            return json_string[start_index + 1:end_index], end_index + 1
        else:
            end_index += 1
    return '', end_index


def extract_number(json_string, start_index):
    """
    从给定的索引开始提取 JSON 数字，并返回提取的数字及结束索引
    参数：
        json_string: str - 要从中提取数字的 JSON 格式字符串
        start_index: int - 开始提取的索引
    返回：
        tuple - 包含提取的数字及结束索引的元组
    """
    end_index = start_index
    while end_index < len(json_string) and (json_string[end_index].isdigit() or json_string[end_index] == '.'):
        end_index += 1
    return json_string[start_index:end_index], end_index


def json_tokens(json_string):
    """
    将 JSON 格式字符串解析为 token 列表，支持数字和字符串中的转义双引号
    参数：
        json_string: str - 要解析的 JSON 格式字符串
    返回：
        list - 包含解析后 token 的列表
    """
    results = []
    i = 0
    # while i < len(json_string):
    #     if is_punctuation(json_string[i]):
    #         results.append(json_string[i])
    #         i += 1
    #     elif json_string[i] == ' ':
    #         i += 1
    #     elif json_string[i] == '"':
    #         word, end_index = extract_string(json_string, i)
    #         results.append(word)
    #         i = end_index
    #     elif json_string[i].isdigit():
    #         num, end_index = extract_number(json_string, i)
    #         results.append(float(num))  # 将数字转换为浮点数
    #         i = end_index
    #     else:
    #         i += 1
    log("result", results)
    return results


# 测试代码
# json_string = '{ "name": "xigua", "height": 169, "score": 95.5 }'
# tokens = json_tokens(json_string)
# print(tokens)  # Output: ['{', 'name', ':', 'xigua', ',', 'height', ':', 169.0, ',', 'score', ':', 95.5, '}']
# print(tokens)  # Output: ['{', 'name', ':', 'xigua', ',', 'height', ':', 169.0, ',', 'score', ':', 95.5, '}']
def test_json_tokens():
    string1 = '{"xigua": "a\"b","height": 169}'
    num1 = ["{", "xigua", ":", "a\"b", ",", "height", ":", 169, "}"]
    log(json_tokens(string1))
    # ensure(json_tokens(string1) == num1, 'testJsonTokens1')

    # string2 = '[{"student": 1}, {"student": 2}]'
    # num2 = ["[", "{", "student", ":", 1, "}",
    #         ",", "{", "student", ":", 2, "}", "]"]
    # ensure(json_tokens(string2) == num2, 'testJsonTokens2')
    #
    # string3 = '{}'
    # num3 = ["{", "}"]
    # ensure(json_tokens(string3) == num3, 'testJsonTokens3')


def ensure(condition, message):
    if not condition:
        log('*** 测试失败:', message)
    else:
        log("success")


def main():
    log('wefwef')
    test_json_tokens()

main()